/**
 * 手写实现flat方法
 */
const arr = [1, [2, 3], [4, [5, 6]], [[7, 8], 9], [10, [11, [12, 13]]]];
function flat1(arr) {
  return arr.flat(Infinity)
}
function flat2(arr) {
  return arr.reduce((acc,curr)=>{
    return acc.concat(Array.isArray(curr) ? flat2(curr) : curr)
  },[])
}
function flat3(arr) {
  let res = [...arr]
  while(res.some(Array.isArray)) {
    res = [].concat(...res)
  }
  return res
}
function flat4(arr) {
  const res = [].concat(...arr)
  return res.some(Array.isArray) ? flat4(res) : res
}
function flat5(arr) {
  const res = []
  const stack = [...arr]
  while(stack.length) {
    const item = stack.shift()
    Array.isArray(item) ? stack.push(...item) : res.push(item)
  }
  return res
}
console.log(flat5(arr))